package algo_annotations.params.param_component;

import algo_annotations.params.ParamsManager_a;
import algo_annotations.params.Params_a;
import algo_annotations.params.objects.ContrainteGeomAnno;
import commons.data.category.Category;
import commons.params.param_component.AbstractParamComponent_table;
import commons.utils.Utils;
import java.util.ArrayList;
import javax.swing.JComponent;


public class ParamComponent_table_ContrainteGeomAnno extends AbstractParamComponent_table {

	public ParamComponent_table_ContrainteGeomAnno(String name, ParamsManager_a paramsManager, JComponent component, boolean bCanBeNull) {
		super(name, paramsManager, component, bCanBeNull,
				new String[] {"Nom catégorie", "Hauteur anno (mm)", "Diamètre site (mm)", "Dist. idéale Anno-Site", "Dist. max Anno-Site"},
				new String[] {"nomCategorie", "hauteurAnno", "diametreSite", "distIdealeAnnoSite", "distMaxAnnoSite"},
				new Class[] {String.class, String.class, String.class, String.class, String.class});
	}

	// appelée à la fin par ParamsManager afin de constituer le Params
	// l'argument params permet de retrouver certains objets déjà lus, via leur nom
	//  (les catégories, en l'occurence)
	public ArrayList<ContrainteGeomAnno> getVParamGeomAnno(Params_a params) {
		ArrayList<ContrainteGeomAnno> vPGA = new ArrayList<ContrainteGeomAnno>();

		for (int numRow = 0; numRow <data.size() ; numRow++) {
			Object[] rowData = data.get(numRow);

			Category categorie = params.getCategorySiteByName((String) rowData[0]);
			double hauteurAnno = Double.parseDouble((String) rowData[1]);
			double diametreSite = Double.parseDouble((String) rowData[2]);
			double distIdeale = Double.parseDouble((String) rowData[3]);
			double distMax = Double.parseDouble((String) rowData[4]);

			ContrainteGeomAnno pga = new ContrainteGeomAnno(
										categorie,
										hauteurAnno,
										diametreSite,
										distIdeale,
										distMax
									);
			vPGA.add(pga);
		}
		return vPGA;
	}


	//**************************************************************************
	//**************************************************************************

	@Override
	public void makeStandardControls() {
		assert possibleValues[0] != null;

		// Test si la table peut etre vide
		if (!bCanBeNull && bIsNull) {
			invalidateComponent("Il est obligatoire de déclarer des paramètres géométriques", true);
			return;
		}

		beginControls();

		// Parcourt des row
		for (int row = 0; row <data.size() ; row++) {

			//***** Nom de la catégorie
			basicCheck_NoDoublon(row, 0);

			//***** Hauteur des annotations
			basicCheck_FloatPos(row, 1); // peut valoir 0 si l'on ne souhaite pas voir l'anno de ce site

			//***** Diametre des sites
			basicCheck_FloatStrictPos(row, 2);

			//***** Distance idéale Anno-Site
			// si hauteur = 0 , ce paramètre peut etre = 0
			if (Utils.isFloat((String)data.get(row)[1]) && Double.parseDouble((String)data.get(row)[1])==0)
				basicCheck_FloatPos(row, 3);
			else
				basicCheck_FloatStrictPos(row, 3);

			//***** Distance max Anno-Site
			// si hauteur = 0 , ce paramètre peut etre = 0
			if (Utils.isFloat((String)data.get(row)[1]) && Double.parseDouble((String)data.get(row)[1])==0)
				basicCheck_FloatPos(row, 4);
			else
				if (basicCheck_FloatStrictPos(row, 4)) {
					// La dist max doit etre > dist ideale :
					//  on reverifie si la dist ideale est bien un float avant la comparaison ...
					if (Utils.isFloat((String)data.get(row)[3])) {
						double distIdeale = Double.parseDouble((String)data.get(row)[3]);
						double distMax = Double.parseDouble((String)data.get(row)[4]);

						if (distMax<=distIdeale)
							addError(row, 4, "On doit avoir : dist. max > dist. idéale");

					}
				}

		}
		finaliseControls();
	}

}
